/*
* bind用来绑定一个方法的调用对象，并返回该方法
* o与fn相当于返回函数的私有变量
* 判断一个方法是被谁调用，看其什么时候加“()”,若果不加则是引用，特别注意引用后，引用后则只剩下单纯的方法，与方法的原对象没有任何关系
* */
var bind = function(o, fn) {
   return function() {
       return fn.apply(o, Array.prototype.slice.call(arguments));
   };
};

/*
* Function.prototype.bind();
* 上述方法是ECMAScript5中提供的方法
* 在没有ECMAScript5的环境中我们可以如下来实现，类似函数的科里化(函数部分应用)
* */
Function.prototype.bind = (function() {
    if(typeof Function.prototype.bind){
        return Function.prototype.bind;
    }else {
        return function(obj) {
            var fn = this,
                slice = Array.prototype.slice,
                args = slice.call(arguments, 1);
            return function() {
                return fn.apply(obj, args.concat(slice.call(arguments)));
            };
        };
    }
}());